昨天,我們已建立完決策樹,那今天,我打算帶入資料去看他分類結果:
建立決策樹的使用模型:
#用樹來預測樣本
def tree_Classify(decisionTree, featureLabel, testDataSet):
firstFeature = list(decisionTree.keys())[0]
secondFeatDict = decisionTree[firstFeature]
splitValue = float(list(secondFeatDict.keys())[0][1:])
#因為test資料少目標值,所以在計算索引時要少1
featureIndex = featureLabel[firstFeature-1]
if float(testDataSet[featureIndex] )<= splitValue:
valueOfFeat = secondFeatDict['<' + str(splitValue)]
else:
valueOfFeat = secondFeatDict['>' + str(splitValue)]
#如果還有字典,就繼續往下
if isinstance(valueOfFeat, dict):
pred_label = tree_Classify(valueOfFeat, featureLabel, testDataSet)
else:
pred_label = valueOfFeat
return pred_label
test_Data = [1.09,3.852,2,3.5]
pre_label = tree_Classify(myTree1, data.columns[1:], test_Data)
print(pre_label)
這樣子就會得到結果:輸出2
當然如果只有一棵樹就當成預測結果,會顯得太獨斷一點,所以利用之前說明的袋裝法,來生成多個的train集就可以建立多個樹,有了多個樹就會有多個預測類別最後因為是類別型資料,所以取個數最多的就是最終預測
首先改寫一下bagging_k
import random as rd
import pandas as pd
import copy
#一個5維資料,共5筆,data(第0維為y)
data=pd.DataFrame([[1,1.01,0.852,5,1.5],[2,2.01,0.31,8,8.1],[1,3.01,0.589,9,5.6],[1,3.01,0.01,8,2.3],[2,4.01,0.258,10,1.1]])
#預設m=4:表示重複抽資料4次;k=5:表示5組資料;d=3:隨機選三個特徵
def bagging_k(data,m=4,k=5,d=3):
n=len(data)
#建立放全部資料的data_k
data_k=[]
for j in range(k):
data_use1=[]
#選取除目標以外d個特徵
features = rd.sample(range(1,n), d)
#把目標加回去
features.insert(0,0)
features.sort()
print("第",j+1,"組特徵:",features)
data_use1=copy.deepcopy(data[features])
print(data_use1)
rows=[]
#重複抽樣過程
for i in range(m):
rows.append(rd.randint(0, len(data_use1)-1))
data_m=data_use1.iloc[rows]
print("第",j+1,"組數據:",data_m)
#重排索引
data_m=data_m.reset_index(drop=True)
data_k.append(data_m)
return data_k
print("全部數據:",bagging_k(data))
結果如下:
全部數據: [
0 1 3 4
0 2 4.01 10 1.1
1 2 2.01 8 8.1
2 1 1.01 5 1.5
3 2 4.01 10 1.1,
0 1 2 4
0 1 3.01 0.010 2.3
1 1 1.01 0.852 1.5
2 1 1.01 0.852 1.5
3 1 1.01 0.852 1.5,
0 1 2 3
0 1 3.01 0.010 8
1 1 3.01 0.010 8
2 1 3.01 0.589 9
3 1 3.01 0.589 9,
0 1 2 4
0 2 2.01 0.310 8.1
1 2 2.01 0.310 8.1
2 1 3.01 0.010 2.3
3 1 3.01 0.589 5.6,
0 2 3 4
0 1 0.010 8 2.3
1 2 0.310 8 8.1
2 1 0.589 9 5.6
3 2 0.310 8 8.1]
這樣就有多組數據,再來做關於決策樹建立,
trees=[]
for i in bagging_k(data):
trees.append(create_Tree(i))
for j in trees:
print(j)
建立完後就會有很多棵樹,如下:
{4: {'<3.55': {1: {'<2.51': 1.0, '>2.51': 2.0}}, '>3.55': 1.0}}
{1: {'<2.51': 2.0, '>2.51': 1.0}}
{3: {'<9.0': {1: {'<2.51': 2.0, '>2.51': 1.0}}, '>9.0': 2.0}}
{2: {'<0.4495': 2.0, '>0.4495': 1.0}}
{1: {'<1.51': 1.0, '>1.51': {2: {'<0.134': 1.0, '>0.134': 2.0}}}}
再來就是針對test集依照這幾棵樹來預測類別
trees=[]
data_k=bagging_k(data)
for i in data_k:
trees.append(create_Tree(i))
for j in range(len(trees)):
test_Data = pd.DataFrame([[1.09,3.852,2,3.5]],columns=[1,2,3,4])
if isinstance(trees[j], dict):
pre_label = tree_Classify(trees[j], data_k[j].columns[1:], test_Data)
else:
pre_label = trees[j]
print("預測類別:",pre_label)
所以預測完後,選最多類別
預測類別: 2.0
預測類別: 1.0
預測類別: 1.0
預測類別: 2.0
預測類別: 1.0
-->所以就是第1類比例最多-->所以預測就是1
好,今天實作部分完成了,明天就說明下回歸方法下隨機森林差異
在男孩敲了門之後,屋內的歌聲突然消失了,在一陣寂靜之後,門緩緩打開,但卻沒有任何人出現,男孩疑惑地往屋內看,裡面黑漆漆一片,甚麼也看不到,男孩順著牆壁找到了電燈開關,他按了下去,瞬間,屋內充滿光亮,但男孩發現裡面甚麼都沒有,只有剛剛的窗簾和正中央有一張桌子,桌子上只有一個木頭做成的人偶,人偶上有一雙大大的眼睛,正望著窗簾,男孩走近一看,發現這個人偶只有眼睛,但卻沒有嘴巴
--|為了你,我失去了一切 |-- MS.CM